package org.jxf.gps.jt808.server;

import org.apache.log4j.Logger;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelEvent;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
import org.jxf.gps.jt808.message.MsgHandle;


public class UDPServerHandler extends SimpleChannelUpstreamHandler{
	private static Logger logger = Logger.getLogger(UDPServerHandler.class);
	
	private int count = 0;
	private int count2 = 0;
	private int count3 = 0;
    /**
     *  对于ChannelHandler，
     *  是UDP与TCP区别的核心所在。
     *  大家都知道UDP是无连接的，
     *  也就是说你通过 MessageEvent 参数对象的 getChannel() 方法获取当前会话连接，
     *  但是其 isConnected() 永远都返回 false。
     *  UDP 开发中在消息获取事件回调方法中，
     *  获取了当前会话连接 channel 对象后可直接通过 channel 的 write 方法发送数据给对端 channel.write(message, remoteAddress)，
     *  第一个参数仍然是要发送的消息对象， 
     *  第二个参数则是要发送的对端 SocketAddress 地址对象。
     *  这里最需要注意的一点是SocketAddress，在TCP通信中我们可以通过channel.getRemoteAddress()获得，
     *  但在UDP通信中，我们必须从MessageEvent中通过调用getRemoteAddress()方法获得对端的SocketAddress 地址。 
     */
    @Override
    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
            throws Exception {
        
		MsgHandle handle = new MsgHandle(e);
		handle.handle();
		logger.debug("messageReceived " + count++);
        super.messageReceived(ctx, e);
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
            throws Exception {
		super.exceptionCaught(ctx, e);
		//e.getCause().printStackTrace();
		Channel ch = e.getChannel();
		ch.close();
		logger.error(this + " "+"exceptionCaught",e.getCause());
    }
    
	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		
		super.channelConnected(ctx, e);
		logger.debug("channelConnected " + count2++);
	} 
	
	@Override
	public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e)
			throws Exception {
		
		super.handleUpstream(ctx, e);
		logger.debug("handleUpstream " + count3++);
	}	

}